import * as XLSX from "xlsx";

/**
 * 将JSON数据转换为Excel文件并下载
 * @param data JSON数据数组
 * @param fileName 下载的文件名（不含扩展名）
 * @param sheetName Excel工作表名称
 */
export function exportJsonToExcel(
  data: Record<string, any>[],
  fileName: string = "data",
  sheetName: string = "Sheet1"
): void {
  if (!data || data.length === 0) {
    console.error("没有数据可导出");
    return;
  }

  try {
    // 创建工作簿
    const workbook = XLSX.utils.book_new();

    // 将JSON数据转换为工作表
    const worksheet = XLSX.utils.json_to_sheet(data);

    // 将工作表添加到工作簿
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);

    // 生成Excel文件的二进制数据
    const excelBuffer = XLSX.write(workbook, {
      bookType: "xlsx",
      type: "array",
    });

    // 处理二进制数据并触发下载
    saveExcelFile(excelBuffer, fileName);
  } catch (error) {
    console.error("导出Excel失败:", error);
  }
}

/**
 * 处理二进制数据并触发文件下载
 * @param buffer Excel文件的二进制数据
 * @param fileName 下载的文件名（不含扩展名）
 */
function saveExcelFile(buffer: ArrayBuffer, fileName: string): void {
  // 将ArrayBuffer转换为Blob对象
  const blob = new Blob([buffer], {
    type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8",
  });

  // 创建下载链接
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = `${fileName}.xlsx`;

  // 触发点击事件并清理
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  URL.revokeObjectURL(url);
}
